package me.yushuai.wukong.base.api;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import me.yushuai.wukong.base.api.dto.CartonDTO;
import me.yushuai.wukong.base.api.dto.CreateCartonDTO;
import me.yushuai.wukong.base.api.dto.PagingSearchCarton;
import me.yushuai.wukong.base.api.dto.UpdateCartonDTO;
import me.yushuai.wukong.common.dto.PageDTO;
import me.yushuai.wukong.common.error.WuKongException;
import me.yushuai.wukong.common.exceptin.DuplicateBizIdException;
import me.yushuai.wukong.common.exceptin.NotExistException;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

/**
 * 装箱的Web API接口类
 *
 * @author zhoushuai@189.cn
 * @since 2022-08-25
 */
@Api("装箱Web API")
@FeignClient("${spring.application.name}")
public interface CartonApi {

    /**
     * 新建一条装箱记录
     *
     * @param dto 新建装箱信息
     * @return 返回装箱的编号
     * @throws DuplicateBizIdException 当装箱编码已经存在时抛出异常
     */
    @ApiOperation("新建装箱")
    @PostMapping("/carton")
    Long createCarton(@Validated @RequestBody CreateCartonDTO dto) throws DuplicateBizIdException;

    /**
     * 修改装箱信息
     *
     * @param cartonId 装箱编号
     * @param dto      装箱信息
     * @return 返回被修改的装箱编号
     * @throws NotExistException 当装箱编号不存在时抛出异常
     */
    @ApiOperation("修改装箱")
    @PutMapping("/carton/{cartonId}")
    Long editCarton(@PathVariable("cartonId") Long cartonId, @Validated @RequestBody UpdateCartonDTO dto)
            throws NotExistException;

    /**
     * 删除一条装箱信息
     *
     * @param cartonId 装箱编号
     * @return 返回装箱的编号
     * @throws WuKongException 当装箱不存在时抛出异常
     */
    @ApiOperation("删除装箱")
    @DeleteMapping("/carton/{cartonId}")
    Long deleteCarton(@PathVariable("cartonId") Long cartonId) throws WuKongException;

    /**
     * 获取装箱详细信息
     *
     * @param cartonId 装箱编号
     * @return 返回装箱详细信息
     * @throws NotExistException 当装箱信息不存在时抛出异常
     */
    @ApiOperation("装箱详细信息")
    @GetMapping("/carton/{cartonId}")
    CartonDTO getById(@PathVariable("cartonId") Long cartonId) throws NotExistException;

    /**
     * 分页条件检索海关信息
     *
     * @param searchCarton 分页检索条件
     * @return 分页返回检索结果
     */
    @ApiOperation("分页条件检索装箱信息")
    @PostMapping("/carton-list")
    PageDTO<CartonDTO> pagingSearchCarton(@Validated @RequestBody PagingSearchCarton searchCarton);

    /**
     * 检查业务Id是否存在
     *
     * @param bizId 业务id
     * @return 如果存在返回true否则返回false
     */
    @ApiOperation("检查业务Id是否存在")
    @GetMapping(value = "/carton/{bizId}", params = "action=exist-by-biz-id")
    boolean existByBizId(@PathVariable("bizId") String bizId);
}
